// es2017

const obj = {
  foo: 'value1',
  bar: 'value2'
}

// Object.values 返回所有值组成的数组 -------------------

console.log(Object.values(obj))

// Object.entries 以数组的方法返回对象的键值对 --------------

// console.log(Object.entries(obj))
// for (const [key, value] of Object.entries(obj)) console.log(key,value)
// 将对象转化为map
console.log(new Map(Object.entries(obj)))

// Object.getOwnPropertyDescriptors 获取对象的属性的完整描述信息
// getter setter属性不能通过 Object.assign 复制
// 主要配合 getter setter 使用

const p1 = {
  firstName: 'Lei',
  lastName: 'Wang',
  get fullName () {
    return this.firstName + ' ' + this.lastName
  }
}

// console.log(p1.fullName)

// const p2 = Object.assign({}, p1)
// p2.firstName = 'zce'
// console.log(p2.fullName) // 因为 assign 把 fullName当做普通属性复制了

const descriptors = Object.getOwnPropertyDescriptors(p1)
// console.log(descriptors) // 获取描述信息
const p2 = Object.defineProperties({},descriptors)
p2.firstName = 'aaa'

console.log(p2.fullName)

// String.prototype.padStart / String.prototype.padEnd
// 字符串填充方法

const books = {
  html: 5,
  css: 16,
  javascript: 128
}
// for (const [name, count] of Object.entries(books) ) console.log(name,count)

for (const [name, count] of Object.entries(books)){
  console.log(`${name.padEnd(16,'-')}|${count}`)
}

// 在函数参数中添加尾逗号

// function foo (
//   bar,
//   baz, 
// ){

// }

const arr = [
  100,
  200,
  300,
]

// 标准化了 Async / Await 彻底解决了异步函数嵌套问题